package com.sxj.corejava.code05_方法;

/**
 * @author 石小俊
 * @date 2024年03月09日 10:16
 */
public class Test03_递归方法 {
    public static void main(String[] args) {
        int sum = sum(100);
        System.out.println(sum);

        System.out.println("斐波那契数列第1个数:"+fib(1));
        System.out.println("斐波那契数列第3个数:"+fib(3));
        System.out.println("斐波那契数列第5个数:"+fib(5));
        System.out.println("斐波那契数列第7个数:"+fib(7));
        System.out.println("斐波那契数列第9个数:"+fib(9));
    }

    /**
     * 1-n之间整数之和
     * @param n
     * @return
     */
    public static int sum(int n) {
//        n	sum
//        1	1			1
//        2	1+2=3		sum(1)+2
//        3	3+3=6		sum(2)+3
//        4	6+4=10		sum(3)+4
//        5	10+5=15		sum(4)+5
//        6	15+6=21		sum(5)+6
//
//        100	sum(99)+100
//        sum(99) = sum(98)+99
//        sum(98) = sum(97)+98
//        sum(1) = sum(0)+1
//        sum(0) = sum(-1)+0
        // 可以将求和操作拆分为 n + sum(n-1)
        // 但是由于n的值会无限减少,需要设置一个终止的场景
        // 当n为1的时候终止
        // 归
        if (n == 1) {
            return 1;
        }
        // 递
        return n + sum(n - 1);
    }

    /**
     * 斐波那契数列: 1 1 2 3 5 ... N，后一项=前两项之和
     * 求第n个数是多少
     * @param n
     * @return
     */
    public static int fib(int n){
        // 归:当获取的是第一个数或者第二个数的时候返回1
        if(n == 1 || n == 2){
            return 1;
        }
        // 递
       // 第n个数=第n-1个数+第n-2个数
       return fib(n-1) + fib(n-2);
    }
}
